// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.eva.android.widget;

import android.app.Activity;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.WindowManager;

import com.x52im.rbchat.logic.main.loginimpl.OnLoginIMServerDialogProgress;

import java.util.Observer;

/**
 * 一个可显示进度提示框的定时器（在开发者指定的时间后通知观察者）。
 *
 * @author JackJiang
 * @since 7.3
 */
public class ProgressDialogTimmer {

    private final static String TAG = OnLoginIMServerDialogProgress.class.getSimpleName();

    /** 定时时间（单位：毫秒） */
    protected int delay = 6000;
    /** 进度提示文字资源ID */
    protected String content = null;

    private Handler handler = null;
    private Runnable runnable = null;
    /** 定时结束时要通知的观察者 */
    private Observer obserer = null;

    private AProgressDialog progressDialogForPairing = null;
    protected Activity parentActivity = null;

//    private static OnLoginIMServerDialogProgress instance = null;

    public ProgressDialogTimmer(Activity parentActivity, int contentStringId , int delay) {
        this(parentActivity, parentActivity.getString(contentStringId), delay);
    }

    public ProgressDialogTimmer(Activity parentActivity, String content , int delay) {
        this.parentActivity = parentActivity;
        this.content = content;
        this.delay = delay;
        init();
    }

    protected void init() {
        progressDialogForPairing = new AProgressDialog(parentActivity, content);
        progressDialogForPairing.setTitle(null);
        progressDialogForPairing.setCanceledOnTouchOutside(false);

        // 监听手机返回键：
        // 返回键在系统分发时，发送Message去调用KeyEvent.changeTimeRepeat。长按时会发多次KeyEvent.ACTION_DOWN。
        // 第一次event.getRepeatCount()为返回0，之后递增。避免长按多次调用onKeyDown添加repeatCount == 0判断
        progressDialogForPairing.setOnKeyListener((dialog, keyCode, event) -> {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                // 根据需求实现代码
                backPressed();
            }
            return false;
        });

        handler = new Handler();
        runnable = () -> {
            if(obserer != null)
                obserer.update(null, null);
        };
    }

    /**
     * 显示进度提示对话框.
     *
     * @param show
     */
    public void showProgressDialogForPairing(boolean show) {
        if(show) {
            // FIX:google分析记录过1次这种崩溃：BadTokenException (@LoginActivity$OnLoginDialogProgress:showProgressDialogForPairing:801) {main}
            // 这种崩溃的原因可能是在进度条尝试显示的同时loginActivity因其它原因崩溃了！
            try {
                // FIXBUG: google统计到IllegalStateException (@LoginActivity$OnLoginDialogProgress:showProgressDialogForPairing:809) {main}
                //         错误，此if语句是为了保证延迟线程里不会因Activity已被关闭而此处却要非法地执行show的情况（此判断可趁为安全的show方法哦！）
                if(parentActivity != null && !parentActivity.isFinishing())
                    progressDialogForPairing.show();
                // 开启一条延迟重试任务
                handler.postDelayed(runnable, delay);
            }
            catch (WindowManager.BadTokenException e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
        else {
            // 无条件停掉延迟重试任务
            handler.removeCallbacks(runnable);
            obserer = null;
            // 此if语句是为了保证延迟线程里不会因Activity已被关闭而此处却要非法地执行show的情况（此判断可趁为安全的show方法哦！）
            if(parentActivity != null && !parentActivity.isFinishing())
                progressDialogForPairing.dismiss();

            // 尝试清理对象引用，防止内存泄漏发生
            tryClearForWeak();
        }
    }

    /**
     * 尝试清理对象引用，防止内存泄漏发生。
     */
    protected void tryClearForWeak() {
        if(this.obserer != null)
            this.obserer = null;
        if(handler != null)
            handler.removeCallbacks(runnable);
        if(progressDialogForPairing != null)
            progressDialogForPairing = null;// !
        if(parentActivity != null)
            this.parentActivity = null;
    }

    /**
     * 手机上按返回键后要做的事。
     * 默认调用 {@link #showProgressDialogForPairing(boolean)}，参数是false。
     */
    protected void backPressed(){
        this.showProgressDialogForPairing(false);
    }

    public Observer getObsrver() {
        return obserer;
    }

    public void setObsrver(Observer obserer) {
        this.obserer = obserer;
    }

    public boolean isShowing()
    {
        return progressDialogForPairing != null && progressDialogForPairing.isShowing();
    }
}
